﻿using System;
using System.Text;
using System.ComponentModel;
using System.Collections.Generic;
using Sinacor.Infra.UI.Common;
using System.Runtime.Serialization;
using System.Collections.ObjectModel;

namespace Sinacor.UI.Bovespa.Corretagem.Presenter
{
    public class CadastroDesconto : BasePresenter<ICadastroDesconto>
    {


        #region Campos 
        private Communication.Accesso _communicationAcesso; 
        private Communication.Cliente _communicationCliente;
        private Communication.Desconto _communicationDesconto;
        private Communication.DescontoCliente _communicationDescontoCliente;
        private Model.Parameter.FiltroDescontoCliente _filtroDescontoCliente;
        private Model.Parameter.FiltroDescontoChave _filtroDescontoChave;
        private ModelCollection<Model.Desconto> _listaDescontoAfterMarket;
        private ModelCollection<Model.DescontoCliente> _listaDescontoCliente;
        private const string FUNCAOACESSOABAOPERACAO= "CTOP";
        private const string FUNCAOACESSOABAAFTERMARKET = "CDAM";
        private Model.Conflito conflito;
        private Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente _filtroPesquisaCliente;
        private Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada janelaCadatroDesconto;
        private Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente pesquisarCliente;
        //Controlar se existe e qual mensagem para cliente invalido; 
        private short _mensagem;
        private string _apelidoAntigo = "";






        #endregion

        #region Construtor
        public CadastroDesconto(ICadastroDesconto cadastrodescview)
            : base(cadastrodescview)
        {
            _communicationAcesso = new Communication.Accesso(this.Session); 
            _communicationCliente = new Communication.Cliente(this.Session);
            _communicationDesconto = new Communication.Desconto(this.Session);
            _communicationDescontoCliente = new Communication.DescontoCliente(this.Session);
            _filtroDescontoChave = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoChave(); 
            _filtroDescontoCliente = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoCliente();
            _listaDescontoAfterMarket = new ModelCollection<Sinacor.UI.Bovespa.Corretagem.Model.Desconto>();
            _listaDescontoCliente = new ModelCollection<Sinacor.UI.Bovespa.Corretagem.Model.DescontoCliente>();
            janelaCadatroDesconto = Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CadastroDesconto; 
            EnumsTipoOperacaoDesconto = EnumWrapper<Model.Enum.TipoOperacaoDesconto>.GetEnums();
            _filtroPesquisaCliente = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente(); 
        }

        #endregion

        #region Propriedades


        public ModelCollection<Model.Desconto> ListaDescontoAfterMarket
        {
            get { return _listaDescontoAfterMarket; }
            set { _listaDescontoAfterMarket = value; }
        }
        public ModelCollection<Model.DescontoCliente> ListaDescontoCliente
        {
            get { return _listaDescontoCliente; }
            set { _listaDescontoCliente = value; }
        }

        public Model.Parameter.FiltroDescontoCliente FiltroDescontoCliente
        {
            get { return _filtroDescontoCliente; }
            set { _filtroDescontoCliente = value; }
        }

        public Model.Parameter.FiltroDescontoChave FiltroDescontoChave
        {
            get { return _filtroDescontoChave; }
            set { _filtroDescontoChave = value; }
        }

        public Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente FiltroPesquisaCliente
        {
            get { return _filtroPesquisaCliente; }
            set { _filtroPesquisaCliente = value; }
        }

        public Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada JanelaCadatroDesconto
        {
            get { return janelaCadatroDesconto; }
        }

        public Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente PesquisarCliente
        {
            get { return pesquisarCliente; }
            set { pesquisarCliente = value; }
        } 
        public Model.Conflito Conflito
        {
            get { return conflito; }
            set { conflito = value; }
        }
        public short Mensagem
        {
            get { return _mensagem; }
            set { _mensagem = value; }
        } 
        public ObservableCollection<EnumWrapper<Model.Enum.TipoOperacaoDesconto>> EnumsTipoOperacaoDesconto
        {
            get;
            set;
        }
        public string ApelidoAntigo
        {
            get { return _apelidoAntigo; }
            set { _apelidoAntigo = value; }
        } 
        #endregion

        #region Métodos

        #region Alterar Desconto do Cliente
        public bool AlterarDescontoCliente(Model.DescontoCliente desconto)
        {
            bool retorno = true; 
            try
            {
                if (!ValidarDescontoCliente(desconto))

                    retorno = false;

                else
                {
                    _communicationDescontoCliente.AlterarDescontoCliente(desconto);
                    this.View.InformarDescontoAlteradoSucesso(); 
                }
               
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno = false; 
            }
            return retorno;
        }
        #endregion
        #region Atualizar Nova Pesquisa
        public void AtualizarNovaPesquisa()
        {
            if(ListaDescontoCliente.Count >0)
                ListaDescontoCliente.Clear();

            FiltroDescontoCliente = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoCliente(); 
            this.View.AtualizarDescontoCliente();
            this.View.AtualizarNovaPesquisa(); 

        }
        #endregion
        #region Inicializar com a validação e carga do grid
        public void Inicializar()
        {
            // Verificar se têm acesso Aba operação
            if (!verificarAcesso(FUNCAOACESSOABAOPERACAO))
                this.View.DesabilitarAbaPorOperacao(); 

            // Verificar se têm acesso Aba AfterMarket

            if (!verificarAcesso(FUNCAOACESSOABAAFTERMARKET))
            {
                // Task  :  5969
                // Autor :  Apsilva
                // Data  :  31/03/2009
                this.View.DesabilitarAbaAfterMarket(); 
                return; 
            }
           
            //// Consultar
            this.ConsultarDescontosAfterMarket(); 

            // Carregar Grid After Market

            this.View.AtualizarDescontosAfterMarket();

            this.View.AtualizarDescontoCliente(); 

            this.View.AtualizarPesquisa();

        }
        #endregion
        #region Consultar Descontos After Market
        public  void ConsultarDescontosAfterMarket()
        {
            try
            {
               _listaDescontoAfterMarket = _communicationDesconto.ConsultarDescontos(FiltroDescontoChave) ;
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        public void AbrirPesquisaCliente()
        {
               FiltroPesquisaCliente.Apelido = FiltroDescontoCliente.ApelidoCliente;
               this.View.AbrirPesquisaCliente(); 
        }
        #endregion 
        #region Consultar Descontos Clientes
        public void ConsultarDescontosClientes()

        {
            try
            {
                _listaDescontoCliente = _communicationDescontoCliente.ConsultarDescontosClientes(FiltroDescontoCliente);
                if (_listaDescontoCliente.Count == 0)
                    this.View.PesquisaSemDados();
                this.View.AtualizarDescontoCliente(); 
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }


        }
        #endregion
        #region Excluir Desconto
        public bool ExcluirDesconto ( Model.Desconto request) 
        {
            bool retorno = true;
            retorno = this.View.ConfirmarExclusaoDesconto(); 
            if (retorno)
            {
                Model.Parameter.FiltroDescontoChave filtro = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoChave();
                try
                {
                    this._communicationDesconto.ExcluirDesconto(translatorDescontoToFiltroDescontoChave(request));
                    this.View.InformarDescontoExcluidoSucesso(); 
                }
                catch (Exception ex)
                {
                    base.HandleException(ex);
                    retorno = false;
                }
                
                
            }
            return retorno;
        }
        #endregion 
        #region Excluir Desconto Cliente
        public bool ExcluirDescontoCliente(Model.DescontoCliente request)
        {
            bool retorno = true;
            if (this.View.ConfirmarExclusaoDesconto())
            {
                Model.Parameter.FiltroDescontoChave filtro = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoChave();
                try
                {
                    this._communicationDescontoCliente.ExcluirDescontoCliente(translatorDescontoToFiltroDescontoChave(request));
                    this.View.InformarDescontoExcluidoSucesso(); 
                }
                catch (Exception ex)
                {
                    base.HandleException(ex);
                    retorno = false;
                }
            }

            else
            {
                retorno = false;
            }
            return retorno;
        }


        #endregion 
        #region Incluir Desconto
        public bool IncluirDesconto(Model.Desconto desconto)
        {
            bool retorno = true;

            // Validar Desconto 
            if (!this.ValidarDesconto(desconto))
                return false;
            
            Conflito = VerificarConflito(desconto);
            // Verificando se existe  Conflito
           
            if (conflito.ExisteConflito)
            {

                // Verificar Se Permite Ajuste
                if (conflito.PermiteAjuste)
                {
                    if (this.View.ConfirmarPermiteAjuste())
                    {
                        retorno = IncluirAjusteDesconto(desconto);


                    }
                    else

                        retorno = false; 

                }
                else
                {
                    this.View.InformarConflitoSemAjuste();
                    retorno = false; 
                }

            }

            else
            {

                retorno = InserirDescontoSemConflito(desconto);
            }


            if (retorno)
                this.View.InformarDescontoIncluidoSucesso(); 
            
            return retorno;
        }
        #endregion
        #region Ajuste para Desconto com Conflito
        private bool  IncluirAjusteDesconto(Model.Desconto desconto)
        {
            bool retorno = true; 
            try
            {
                  _communicationDesconto.IncluirAjustarDesconto(desconto);
                  retorno = true;   

            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno = false; 

            }
            return retorno;
        }
        #endregion
        #region Inserir Desconto Cliente
        public bool IncluirDescontoCliente(Model.DescontoCliente request)
        {
            
            bool retorno = true;

            
            if (!ValidarDescontoCliente(request))
            {
                retorno = false;
            }
            else

                
            {
                retorno = IncluirDescontoClienteServico(request);
            }

            if (retorno)
                this.View.InformarDescontoIncluidoSucesso(); 

            return retorno;
        }
        #endregion 
        #region  Incluir Desconto Cliente Servico
        private bool IncluirDescontoClienteServico(Model.DescontoCliente request)
        {
            bool retorno = true; 
            try
            {
                _communicationDescontoCliente.IncluirDescontoCliente(request);
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno = false;
            }
            return retorno;
        }
        #endregion

        #region Inserir Desconto Sem Conflito
        private bool InserirDescontoSemConflito(Model.Desconto desconto)
        {
            bool retorno = true; 
            try
            {
                _communicationDesconto.IncluirDesconto(desconto);

                
                retorno = true;
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno = false;
            }
            return retorno;
        }
        #endregion

        #region Validar Desconto
        private bool ValidarDesconto(Model.Desconto desconto)
        {
            bool retorno = true;
            if (desconto.Periodo == null ||  desconto.Periodo.DataInicial == null)
            {
                this.View.InformarDataInicialObrigatoria();
                retorno = false;
            }

            if (desconto.Periodo == null || desconto.Periodo.DataFinal == null)
            {
                this.View.InformarDataFinalObrigatoria();
                retorno = false;
            }
            
            if (desconto.Periodo !=null &&  desconto.Periodo.DataFinal < desconto.Periodo.DataInicial)
            {
                this.View.InformarDataFinalInvalida();

                retorno = false; 
            }

            if (desconto.PercentualAllIn == null)
            {
                this.View.InformarAllInObrigatorio();
                retorno = false; 
            }
            if (desconto.PercentualDescontoAcresimo == null)
            {
                this.View.InformarDescontoObrigatorio();
                retorno = false;
            }
            if (desconto.PercentualDescontoAcresimo < -100)
            {
                this.View.InformarDescontoMaiorCem();
                retorno = false; 
            }
               
            return retorno;

        }
        #endregion
        #region Validacao de Desconto para Cliente
        public bool ValidarDescontoCliente(Sinacor.UI.Bovespa.Corretagem.Model.DescontoCliente request)
        {
            bool retorno = true;
            if (request.CodigoCliente == null && request.ApelidoCliente == this.ApelidoAntigo )
            {
                if (this._mensagem == 1)
                    //this.View.InformarCodigoClienteObrigatorio();
                    this.View.InformarClienteInexistente();

                if (this._mensagem == 2)
                    this.View.InformarClienteInvalido(); 

                retorno = false;
            }
            if (!string.IsNullOrEmpty(request.ApelidoCliente) && request.ApelidoCliente != this.ApelidoAntigo)
            {
                VerificarApelidoCliente(ref request);
                retorno = (request.CodigoCliente != null); 
            }

            if (string.IsNullOrEmpty( request.ApelidoCliente))
            {
                this.View.InformarApelidoObrigatorio();
                retorno = false;

            }
            if (request.TipoOperacao == null)
            {
                this.View.InoformarTipoOperacaoDesconto();
                retorno = false;
            }

            if (request.PercentualDescontoAcresimo == null)
            {
                this.View.InformarDescontoObrigatorio();
                retorno = false;
            }

            if (request.PercentualDescontoAcresimo < -100)
            {
                this.View.InformarDescontoMaiorCem();
                retorno = false;
            }


            return retorno;
        }
        #endregion
        #region Traduzir de Desconto Cliente para Filtro Desconto Cliente
        private Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoCliente translatorDescontoToFiltroDescontoChave(Sinacor.UI.Bovespa.Corretagem.Model.DescontoCliente request)
        {
            Model.Parameter.FiltroDescontoCliente response = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoCliente();

            response.ApelidoCliente = request.ApelidoCliente;
            response.CodigoCliente = request.CodigoCliente;
            response.PercentualDescontoAcresimo = request.PercentualDescontoAcresimo;
            
            if (request.TipoOperacao != null) 
                response.TipoOperacao =  (EnumWrapper<Model.Enum.TipoOperacaoDesconto>) request.TipoOperacao.Value; 

            return response; 
        }
        #endregion 
        #region Traduzir de Desconto para Filtro Desconto Chave
        private Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoChave translatorDescontoToFiltroDescontoChave(Sinacor.UI.Bovespa.Corretagem.Model.Desconto request)
        {
            Model.Parameter.FiltroDescontoChave filtro = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroDescontoChave();
            filtro.PercentualAllIn = request.PercentualAllIn;
            filtro.PercentualDescontoAcresimo = request.PercentualDescontoAcresimo;
            filtro.Periodo = request.Periodo;
            return filtro;
        }
        #endregion 
        #region vericar Acesso
        private bool verificarAcesso(string funcao)
        {

            bool retorno=true; 
            try
            {
                Model.Parameter.FiltroVerificarAcessoFuncao verificar = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroVerificarAcessoFuncao(); 
                verificar.Funcao = funcao; 
                retorno  = _communicationAcesso.VerificarAcessoFuncao(verificar);
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno =false; 
            }
            return retorno;
        }
        #endregion

        #region  VerificarApelidoCliente
        public void VerificarApelidoCliente (ref Model.DescontoCliente request) 
        {
            if (string.IsNullOrEmpty(request.ApelidoCliente))
                return;
            this.ApelidoAntigo = request.ApelidoCliente; 
            Model.Parameter.FiltroClientePorApelido filtro = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroClientePorApelido(); 
            filtro.ApelidoCliente = request.ApelidoCliente; 
            filtro.IsListaAssessores = false;

            Model.Cliente cliente = consultarClientePorApelido(filtro); 
            if (cliente  == null || cliente.Codigo == null)
            {
                request.CodigoCliente = null; 
                this._mensagem = 1; 
                this.View.InformarClienteInexistente();
                return; 
            }

            filtro.IsListaAssessores = true;

             cliente = consultarClientePorApelido(filtro);
             if (cliente == null || cliente.Codigo == null)
             {
                 request.CodigoCliente = null;
                 this._mensagem = 2; 
                 this.View.InformarClienteInvalido();
                 return;
             }
             else
             {
                 request.CodigoCliente = cliente.Codigo; 
             }

        }
        #region Consultar Cliente Por Apelido
        private Model.Cliente consultarClientePorApelido(Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroClientePorApelido filtro)
        {
            Model.Cliente retorno = new Sinacor.UI.Bovespa.Corretagem.Model.Cliente(); 
            try
            {
                retorno=  (_communicationCliente.ConsultarPorApelido(filtro) ) ;
                
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                retorno = new Model.Cliente(); 
            }
            return retorno;
        }
        #endregion 
        #endregion
        #region Verificar Conflito
        public  Model.Conflito VerificarConflito( Model.Desconto request)
        {
            return  this._communicationDesconto.VerificarConflitoPeriodo(request); 
        }
        #endregion 
        #region Retorno da Pesquisa no Cadastro de Clinete
        public void RetornoPesquisaCliente(Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente request)
        {
            PesquisarCliente = request;
            if (PesquisarCliente.Codigo > 0)
            {
                FiltroDescontoCliente.ApelidoCliente = PesquisarCliente.Apelido;
                FiltroDescontoCliente.CodigoCliente = PesquisarCliente.Codigo;

                this.View.AtualizarPesquisa();
            }
        }
        #endregion
        #endregion





    }
}
